package ydzhao.weixin.tuisong.service.impl;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.stereotype.Service;
import ydzhao.weixin.tuisong.entity.MessageType;
import ydzhao.weixin.tuisong.output.TextMessage;
import ydzhao.weixin.tuisong.service.WechatService;
import ydzhao.weixin.tuisong.util.PushUpdate;
import ydzhao.weixin.tuisong.util.ReplyMessageUtil;
import ydzhao.weixin.tuisong.util.WeixinUtil;
import ydzhao.weixin.tuisong.util.XmlUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author chlong
 * @date 2022/8/9
 */
@Service
public class WechatServiceImpl implements WechatService {

    /**
     * 用户在微信公众号发送消息后, 微信服务器会发送一个 POST 请求过来
     * POST 请求中携带者用户发送的数据（XML 格式）
     *
     * @return 数据的 Map 格式
     */
    @Override
    public Map<String, String> parseXml(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 将解析结果存储在HashMap中
        Map<String, String> map = new HashMap<String, String>();
        // 从request中取得输入流
        InputStream inputStream = request.getInputStream();
        // 读取输入流
        SAXReader reader = new SAXReader();
        Document document = reader.read(inputStream);
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();
        // 遍历所有子节点
        for (Element e : elementList) {
            map.put(e.getName(), e.getText());
        }
        // 释放资源
        inputStream.close();
        inputStream = null;
        return map;
    }

    /**
     * 消息文件输出
     * @param map
     * @return
     */
    @Override
    public String parseMessage(Map<String, String> map) {
        String respXml = null;
        try {
            // 发送方帐号
            String fromUserName = map.get("FromUserName");
            // 开发者微信号
            String toUserName = map.get("ToUserName");
            // 取得消息类型
            String MsgType = map.get("MsgType");
            // 发现直接把要返回的信息直接封装成replyMap集合，然后转换成 xml文件，是不是实体类可以不用了
            Map<String, String> replyMap = new HashMap<String, String>();
            replyMap.put("ToUserName", fromUserName);
            replyMap.put("FromUserName", toUserName);
            replyMap.put("CreateTime", String.valueOf(new Date().getTime()));
            if (MsgType.equals(MessageType.TEXT_MESSAGE)) {
                WeixinUtil weixinUtil = new WeixinUtil();
                // 封装文本返回消息
                TextMessage textMessage = new TextMessage();
                textMessage.setToUserName(fromUserName);
                textMessage.setFromUserName(toUserName);
                textMessage.setCreateTime(new Date().getTime());
                textMessage.setContent(weixinUtil.randomReply(map.get("Content")));
                textMessage.getMsgType();
                respXml = ReplyMessageUtil.sendTextMessage(textMessage);

                // 用map集合封装
//                replyMap.put("MsgType", MessageType.RESP_MESSAGE_TYPE_TEXT);
//                replyMap.put("Content", "未识别文本消息");
//                respXml = XmlUtil.xmlFormat(replyMap, true);
//            } else if (MsgType.equals(MessageType.IMAGE_MESSAGE)) {
//                // 这里回复图片 或者图文消息 以图文消息为例
//                NewsOutputMessage message = new NewsOutputMessage();
//                message.setToUserName(fromUserName);
//                message.setFromUserName(toUserName);
//                message.setCreateTime(new Date().getTime());
//                message.getMsgType();
//
//                Articles article = new Articles();
//                article.setDescription("图文消息 "); // 图文消息的描述
//                article.setPicUrl("https://p4.ssl.cdn.btime.com/dmfd/192_108_/t019d0b65e33000f8a0.jpg?size=458x240"); // 图文消息图片地址
//                article.setTitle("图文消息 "); // 图文消息标题
//                article.setUrl("http://www.baidu.com"); // 图文 url 链接
//                List<Articles> list = new ArrayList<Articles>();
//                list.add(article);// 这里发送的是单图文，如果需要发送多图文则在这里 list 中加入多个
//                // Articles！
//
//                message.setArticleCount(list.size());
//                message.setArticles(list);
//                respXml = ReplyMessageUtil.sendImageTextMessage(message)
            } else if (MsgType.equals(MessageType.VOICE_MESSAGE)) {
                // 以下方式根据需要来操作
                replyMap.put("MsgType", MessageType.RESP_MESSAGE_TYPE_TEXT);
                replyMap.put("Content", "未识别语音消息");
                respXml = XmlUtil.xmlFormat(replyMap, true);
            } else if (MsgType.equals(MessageType.VIDEO_MESSAGE)) {
                replyMap.put("MsgType", MessageType.RESP_MESSAGE_TYPE_TEXT);
                replyMap.put("Content", "未识别视频消息");
                respXml = XmlUtil.xmlFormat(replyMap, true);
            } else if (MsgType.equals(MessageType.SHORTVIDEO_MESSAGE)) {
                replyMap.put("MsgType", MessageType.RESP_MESSAGE_TYPE_TEXT);
                replyMap.put("Content", "未识别小视频消息");
                respXml = XmlUtil.xmlFormat(replyMap, true);
            } else if (MsgType.equals(MessageType.POSOTION_MESSAGE)) {
                replyMap.put("MsgType", MessageType.RESP_MESSAGE_TYPE_TEXT);
                replyMap.put("Content", "未识别地理位置消息");
                respXml = XmlUtil.xmlFormat(replyMap, true);
            } else if (MsgType.equals(MessageType.LINK_MESSAGE)) {
                replyMap.put("MsgType", MessageType.RESP_MESSAGE_TYPE_TEXT);
                replyMap.put("Content", "未识别链接消息");
                respXml = XmlUtil.xmlFormat(replyMap, true);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return respXml;
    }

    /**
     * 事件处理
     */
//    @Override
//    public String parseEvent(Map<String, String> map) {
//        String respXml = null;
//        try {
//            // 发送方帐号
//            String fromUserName = map.get("FromUserName");
//            // 开发者微信号
//            String toUserName = map.get("ToUserName");
//            // 取得消息类型
//            String MsgType = map.get("MsgType");
//            //获取事件类型
//            String eventType = map.get("Event");
//
//            // 发现直接把要返回的信息直接封装成replyMap集合，然后转换成 xml文件，是不是实体类可以不用了
//            Map<String, String> replyMap = new HashMap<String, String>();
//            replyMap.put("ToUserName", fromUserName);
//            replyMap.put("FromUserName", toUserName);
//            replyMap.put("CreateTime", String.valueOf(new Date().getTime()));
//            if (eventType.equals(MessageType.EVENT_TYPE_SUBSCRIBE)) {// 关注
//                // 用map集合封装
//                replyMap.put("MsgType", MessageType.RESP_MESSAGE_TYPE_TEXT);
//                replyMap.put("Content", MessageType.menuText());
//                respXml = XmlUtil.xmlFormat(replyMap, true);
//            }
//            if (eventType.equals(MessageType.EVENT_TYPE_UNSUBSCRIBE)) {// 取消关注
//
//            }
//            if (eventType.equals(MessageType.EVENT_TYPE_SCAN)) {// 用户已关注时的扫描带参数二维码
//
//            }
//            if (eventType.equals(MessageType.EVENT_TYPE_LOCATION)) {// 上报地理位置
//
//            }
//            if (eventType.equals(MessageType.EVENT_TYPE_CLICK)) {// 自定义菜单
//
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return respXml;
//    }
}
